package com.carbon.system.controller;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.carbon.common.utils.JwtUtil;
import com.carbon.domain.common.ApiResult;
import com.carbon.system.entity.Menu;
import com.carbon.system.entity.MenuVO;
import com.carbon.system.entity.SysMenu;
import com.carbon.system.entity.SysRoleMenu;
import com.carbon.system.mapper.SysRoleMapper;
import com.carbon.system.mapper.SysRoleMenuMapper;
import com.carbon.system.param.SysMenuQueryParam;
import com.carbon.system.param.SysMenuStatusParam;
import com.carbon.system.service.MenuService;
import com.carbon.system.vo.SysMenuVo;
import com.carbon.system.common.BaseController;
import com.carbon.system.service.SysMenuService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.carbon.system.entity.MenuVO;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.util.List;
import java.util.Map;


/**
 * <p>
 * 菜单  前端控制器
 * </p>
 *
 * @author Li Jun
 * @since 2021-06-18
 */
@Slf4j
@RestController
@RequestMapping("/sysMenu")
@Api(value = "菜单 模块", tags = {"菜单 模块"})
public class SysMenuController extends BaseController {
    @Autowired
    private MenuService menuService;


    @PostMapping("/userMenus")
    public ApiResult<List<MenuVO>> getRoleMenu(HttpServletRequest request) {
        try {
            // 1. 从请求头获取 token（格式：Bearer token值）
            String token = request.getHeader("token");
            if (StrUtil.isEmpty(token)) {
                return ApiResult.fail("token 不存在或格式错误");
            }
            //token = token.replace("Bearer ", ""); // 去除 "Bearer " 前缀

            // 2. 校验 token 有效性
            if (!JwtUtil.isValidToken(token)) {
                return ApiResult.fail("token 无效或已过期");
            }

            // 3. 从 token 中获取 accountId（使用你的 JwtUtil 的 getTokenInfo 方法）
            Long accountId = JwtUtil.getTokenInfo(token, JwtUtil.JWT_ACCOUNT_ID);
            if (accountId == null) {
                return ApiResult.fail("token 中未包含 accountId");
            }


            // 4. 查询用户菜单并返回
            List<MenuVO> menus = menuService.getUserMenus(accountId);
            return ApiResult.ok(menus);
        } catch (Exception e) {
            return ApiResult.fail("获取菜单失败：" + e.getMessage());
        }
    }
    /**
     * 获取所有权限菜单
     * @return 权限菜单树形结构数据等，用 Result 统一封装返回
     */
    @GetMapping("/all")
    public ApiResult<List<MenuVO>> getAllPermissions() {
        List<MenuVO> menus = menuService.getAllPermissions();
         return ApiResult.ok(menus);

    }
    @PostMapping("/add")
    public ApiResult<Boolean> addMenu(@RequestBody Menu menu) {
        if(menu.getParentId()==null){
            menu.setParentId(-1);
        }
        menu.setIsMenu(1);
        menu.setHidden(0);
        boolean save = menuService.saveMenu(menu);
        return ApiResult.result(save);
    }

    /**
     * 编辑菜单
     * @return 通用响应结果
     */
    @PutMapping("/update")
    public ApiResult<Boolean> updateMenu(@RequestBody Menu menuVO) {
        boolean b = menuService.updateMenuById(menuVO);
        // 实际开发中此处会调用Service层处理更新逻辑
        return ApiResult.result(b);
    }
    @DeleteMapping("/delete/{id}") // 接口地址与前端对应
    public ApiResult<Boolean> deleteMenu(@PathVariable("id") Long menuId) {
        List sons =menuService.selectSons(menuId);
        for (int i = 0; i < sons.size(); i++) {

            menuService.deleteMenuById(Long.parseLong(sons.get(i).toString()));
        }
        // 后端逻辑：根据 menuId 删除菜单（若有子菜单，需先删除子菜单，避免外键约束报错）
        Integer i = menuService.deleteMenuById(menuId);
        return ApiResult.result(i>0);
    }


}

